#include<head.h>

#define N 10

char product[N];
int product_len = 0;

pthread_mutex_t mutex ;//互斥锁

void *func_producer(void *arg);//生产者
void *func_consumer_1(void *arg);//消费者1
void *func_consumer_2(void *arg);//消费者2

int main(int argc, char const *argv[])
{
    //创建生产者线程
    pthread_t tid[3];
    //初始化互斥锁
    pthread_mutex_init(&mutex, NULL);
    //初始化产品数量
    product_len = 0;
    //创建生产者线程
    pthread_create(&tid[0], NULL, func_producer, NULL);
    //创建消费者线程
    pthread_create(&tid[1], NULL, func_consumer_1, NULL);
    pthread_create(&tid[2], NULL, func_consumer_2, NULL);
    //等待线程结束
    for(int i = 0; i < 3; i++)
    {
        pthread_join(tid[i], NULL);
    }
    //销毁互斥锁
    pthread_mutex_destroy(&mutex);
    return 0;
}

void *func_producer(void *arg) //生产者
{
    char buf[128] = "student@student-machine:~/code/系统编程/进程线程/day6$";
    int buf_i = 0;//生产产品
    while(1)
    {
        //生产产品
        pthread_mutex_lock(&mutex);
        if(product_len == N )
        {
            //产品已满，等待消费者消费
            pthread_mutex_unlock(&mutex);
            sleep(3);
            continue;
        }
        product[product_len] = buf[buf_i];
        buf_i++;
        product[product_len + 1] = '\0';
        product_len++;//生产产品
        printf("生产者，当前产品数量为%d 产品为%c\n", product_len , product[product_len - 1]);
        pthread_mutex_unlock(&mutex);
        sleep(3);
    }
}

void *func_consumer_1(void *arg) //消费者1
{
    while(1)
    {
        pthread_mutex_lock(&mutex);
        if(product_len == 0)
        {
            //产品已空，等待生产者生产
            pthread_mutex_unlock(&mutex);
            sleep(2);
            continue;
        }
        product_len--;//消费产品
        printf("消费者1,当前产品数量为%d 产品为%c\n", product_len , product[product_len]);
        pthread_mutex_unlock(&mutex);
        sleep(2);
    }
}

void *func_consumer_2(void *arg) //消费者2
{
    while(1)
    {
        pthread_mutex_lock(&mutex);
        if(product_len == 0)
        {
            //产品已空，等待生产者生产
            pthread_mutex_unlock(&mutex);
            sleep(2);
            continue;
        }
        product_len--;//消费产品
        printf("消费者2,当前产品数量为%d 产品为%c\n", product_len , product[product_len]);
        pthread_mutex_unlock(&mutex);
        sleep(2);
    }
}

